package com.dragon.Login;

import com.dragon.ManageDemo.ServerDemo;
import com.dragon.ManageDemo.SocketServer;

import com.dragon.service.impl.UserServiceImpl;
import com.dragon.utils.RegexFunc;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


/**
 * 管理员（服务器）登录界面
 */
public class LoginDemo extends JFrame {

    //登录界面设置和按键监控
    public LoginDemo() throws IOException {


        //获取显示屏的大小
        setTitle("小龙聊天室服务器管理");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int sw = screenSize.width;
        int sh = screenSize.height;

        //窗口宽高大小
        int width = 500;
        int height = 340;
        this.setBounds((sw - width) / 2, (sh - height) / 2, width, height);//设置窗口的位置和大小
        /*this.setIconImage(Toolkit.getDefaultToolkit().getImage(String.valueOf(Images.bombImg)));//窗口图标

        ImageIcon background = Images.bg2Img; //背景图片
        JLabel label = new JLabel(background); // 把背景图片显示在一个标签里面
        label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把标签的大小位置设置为图片刚好填充整个面板*/
/*
        JPanel imagePanel = (JPanel) this.getContentPane(); // 把内容窗格转化为JPanel，否则不能用方法setOpaque()来使内容窗格透明
        imagePanel.setOpaque(false); // 窗口透明，如果不透明，背景图片就会被遮盖住
        this.getLayeredPane().add(label, Integer.valueOf(Integer.MIN_VALUE)); // 把背景图片添加到分层窗格的最底层作为背景*/

        //创建一个面板放入我们需要的元素，最后再将Jpanel面板嵌套在Jframe中
        JPanel panel = new JPanel();

        //盒子模块
        Box ubox = Box.createHorizontalBox();
        Box pbox = Box.createHorizontalBox(); // 水平方向从左向右放置组件
        Box vbox = Box.createVerticalBox(); // 垂直方向放置组件

        //创建界面工具类
        //账号和输入框
        JLabel usernameLabel = new JLabel(" 账号 :"); //文本设计
        usernameLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));
        usernameLabel.setForeground(new Color(0xFBFCFD)); // 设置前景色

        //账号输入框
        JTextField usernameField = new JTextField(); //输入框
        usernameField.setFont(new Font("Arial", Font.BOLD, 15));
        usernameField.setToolTipText("ID");// 悬停显示
        usernameField.setColumns(12);

        //密码和输入框，并且使密码不可显示
        JLabel passwordLabel = new JLabel("密  码:");    //文本设计
        passwordLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));
        passwordLabel.setForeground(new Color(0xFBFCFD)); // 设置前景色

        //设置密码输入文本框
        JPasswordField passwordField = new JPasswordField();
        passwordField.setFont(new Font("Arial", Font.BOLD, 15));
        passwordField.setToolTipText("密码");// 悬停显示
        passwordField.setColumns(12);//设置输入框的宽度
        // 将密码加密为星星符号。
        passwordField.setEchoChar('●');// 星星符号

        //按钮设置，三个按钮：登录、重置、注册账号
        JButton loginButton = new JButton("登录");    //登录按钮
        loginButton.setToolTipText("登录");// 悬停显示，就是鼠标放在上边时就可以出现的小字
        JButton resetButton = new JButton("重置");    //重置按钮
        resetButton.setToolTipText("重置");// 悬停显示
        JMenu RegisterButton = new JMenu("注册账号");    //注册账号按钮
        RegisterButton.setToolTipText("注册账号");// 悬停显示

        // 字体设置
        loginButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
        loginButton.setForeground(Color.white); // 设置前景色
        loginButton.setBackground(new Color(0x08BDFD));
        loginButton.setDefaultCapable(true);//设置为可以是其根窗格的默认按钮
        loginButton.setBounds((this.getWidth() - 120 - 180) / 2, 250, 120, 30); // 设置按钮位置，及按钮大小
        loginButton.setCursor(new Cursor(Cursor.HAND_CURSOR));  //鼠标手势的设置

        resetButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
        resetButton.setForeground(Color.white); // 设置前景色
        resetButton.setBackground(new Color(0x08BDFD));
        resetButton.setDefaultCapable(true);
        resetButton.setCursor(new Cursor(Cursor.HAND_CURSOR));//鼠标手势的设置
        resetButton.setBounds((this.getWidth() - 120 + 180) / 2, 250, 120, 30); // 设置按钮位置，及按钮大小

        RegisterButton.setFont(new Font("微软雅黑", Font.BOLD, 12));
        RegisterButton.setForeground(new Color(0x02FCFC)); // 设置前景色
        RegisterButton.setUI(new BasicButtonUI());  //恢复基本视觉效果
        RegisterButton.setBounds(5, 280, 85, 20); // 设置按钮位置，及按钮大小
        RegisterButton.setContentAreaFilled(false); // 设置按钮透明
        RegisterButton.setCursor(new Cursor(Cursor.HAND_CURSOR));

         /*
         分区模块布局
        */
        //小盒子，设计用户名布局模块
        ubox.add(usernameLabel);
        ubox.add(Box.createHorizontalStrut(5));//插入中间盒子宽度为5，作为相邻文本的空隙
        ubox.add(usernameField);

        //小盒子，设计密码框布局模块
        pbox.add(passwordLabel);
        pbox.add(Box.createHorizontalStrut(5));//插入中间盒子宽度为5，作为相邻文本的空隙
        pbox.add(passwordField);

        //大盒子，将两个小盒子放在这个大盒子中
        vbox.add(Box.createVerticalStrut(80));//插入中间盒子高度为80，作为上下文本的空隙
        vbox.add(ubox);
        vbox.add(Box.createVerticalStrut(60));//插入中间盒子高度为60，作为上下文本的空隙
        vbox.add(pbox);

        usernameField.setText("13187029351");   // 设置默认账号
        passwordField.setText("666666");  // 设置默认密码
        //panel.setUI(new BasicPanelUI());  // 恢复基本视觉效果
        panel.setOpaque(false); // 面板透明，否则背景图片被覆盖
        panel.add(vbox, BorderLayout.CENTER);// vbox盒子居中
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(loginButton);
        this.add(resetButton);
        this.add(RegisterButton);
        this.add(panel);
        this.setVisible(true);
        this.setResizable(false);

//点击按钮的监听事件

        //登录按钮监听事件
        loginButton.addActionListener(e -> {
            try {
                //正则表达式，验证输入数据是否为账号格式
                String account = usernameField.getText();
                String passw = passwordField.getText();
                if (account.equals(null) || account.equals("")) {
                    JOptionPane.showMessageDialog(null, "账号不能为空", "警告",
                            JOptionPane.WARNING_MESSAGE);
                } else {
                    //不为空就接着判断数据格式
                    System.out.println("1");
                    if (!RegexFunc.isUsername(account)) {
                        //如果不符合格式，警告
                        JOptionPane.showMessageDialog(null, "账号格式有误，请输入正确的电话号码",
                                "警告", JOptionPane.WARNING_MESSAGE);
                    } else {
                        System.out.println(2);
                        UserServiceImpl userService=new UserServiceImpl();
                        // 符合就接着判断该账号是否存在
                        if (!userService.isHasUser(account)) {
                            System.out.println(3);
                            // 如果账号不存在，就弹出警告
                            JOptionPane.showMessageDialog(null, "用户不存在",
                                    "警告", JOptionPane.WARNING_MESSAGE);
                        } else {
                            // 如果存在就继续判断密码是否正确
                            System.out.println("开始判断密码：");
                            if (!userService.isRightPassword(account, passw)) {
                                System.out.println(4);
                                // 如果密码错误，就弹出警告
                                JOptionPane.showMessageDialog(null, "密码错误，请重新输入密码",
                                        "警告", JOptionPane.WARNING_MESSAGE);
                                passwordField.setText("");
                            } else {
                                System.out.println("验证通过");
                                // 如果验证通过，就进入服务器管理界面
                                this.dispose();
                                // 监听本机的5566端口，使用accept（）循环接收
                              /*  try {
                                    SocketServer server = new SocketServer();
                                    new Thread(new Runnable() {
                                        @Override
                                        public void run() {
                                            ServerSocket serverSocket = null;
                                            try {
                                                serverSocket = new ServerSocket(5566);
                                            } catch (IOException ex) {
                                                throw new RuntimeException(ex);
                                            }
                                            System.out.println("还是到这儿了");
                                            while (true) {
                                                Socket socket = null;
                                                try {
                                                    socket = serverSocket.accept();
                                                } catch (IOException ex) {
                                                    throw new RuntimeException(ex);
                                                }
                                                server.getClient(socket);
                                            }
                                        }
                                    }).start();
                                } catch (Exception w) {
                                    w.printStackTrace();
                                }*/
                               new Thread(new Runnable() {
                                   @Override
                                   public void run() {
                                       try {
                                           new ServerDemo(5566);
                                       } catch (IOException ex) {
                                           throw new RuntimeException(ex);
                                       }
                                   }
                               }).start();
                            }
                        }

                    }
                }
            } catch (Exception exception) {
                JOptionPane.showMessageDialog(null, "异常", "警告"
                        , JOptionPane.WARNING_MESSAGE);
            }
        });

//重置文本按钮监听事件
        resetButton.addActionListener(e -> {//重置就将文本标签内容置空
            usernameField.setText(null);
            passwordField.setText(null);
        });
    }

}

